// let 变量名 :类型
/* 
类型: 
  number    任意数字
  string    任意字符串
  boolean   布尔值true或false
  字面量     限定变量的值就是该字面量
  any       任意类型
  unknown   安全的any
  void      空值(undefined)
  never     没有值(不能是任何值)
  object    任意的js对象({name:"孙悟空"})
  array     任意的js数组
  tuple     元祖(固定长度的数组)
  enume     枚举(enum{A,B})
*/

/* 
public 在当前类里面，子类，类外面都可以访问
protected 在当前类和子类内容可以访问，类外部无法访问
private 在当前类内部可以访问，子类，类外部都无法访问
属性不加修饰符，默认就是公有的 public
*/
let a: number = 100
console.log(a)

// 可以类型推导
let b = false
console.log(b)

// 函数参数指定类型
function sum(i: number, j: number): void {
  console.log(i + j)
}
sum(10, 1)

// 函数返回值的类型
function sum1(): number {
  return 10
}
console.log(sum1())

// 可以使用 | 连接多个类型
let i: number | string
i = 100

let j: "电脑柜" | "手机包"
j = "手机包"
console.log(j)

// 一个变量设置了any 相当于给变量设置关闭类型检查
// 当声明变量不设置类型时，ts会自动判断变量的类型
let k: any
k = 10
console.log(k)

// unknown 实际上就是一个类型安全的any
// unknown 的变量不能直接赋值给其它的变量
let i1: unknown
i1 = "好的"

let i2: string
// i2 = i1 //此时会报错的

// 使用判断来处理
if (typeof i1 === "string") {
  i2 = i1
}

// 或使用类型断言
i2 = i1 as string  // 或者 i2 = <string>i1
console.log(i2)

// void 表示为空，函数时，表示函数没有返回值
function f1(num: number): void {
  return void (num)
}

// never 表示没有返回值
function f2(): never {
  throw new Error("出错了")
}
